#pragma once

#include "lockqueue.h"

#include "string"

enum LogLevel
{
    INFO,  // 普通信息
    ERROR,  // 错误信息
};

// Mprpc 框架提供的日志系统
class Logger
{
public:
    // 设置日志级别
    void SetLogLevel(LogLevel logLevel);
    // 写日志，把日志信息写入 LockQueue 缓冲区
    void Log(std::string msg);

    // 获取日志单例
    static Logger& GetInstance();

private:
    int m_logLevel;  // 记录日志级别
    LockQueue<std::string> m_lckQue;  // 日志缓冲队列

    // 设置为单例模式
    Logger();
    Logger(const Logger&) = delete;
    Logger(Logger&&) = delete;
};

// 定义宏 LOG_INFO("FFF%d%s", a, cstr)
#define LOG_INFO(logmsgformat, ...) \
    do \
    { \
        Logger &logger = Logger::GetInstance(); \
        logger.SetLogLevel(INFO); \
        char ch[1024] = {0}; \
        snprintf(ch, 1024, logmsgformat, ##__VA_ARGS__); \
        logger.Log(ch); \
    } while(0)

#define LOG_ERROR(logmsgformat, ...) \
    do \
    { \
        Logger &logger = Logger::GetInstance(); \
        logger.SetLogLevel(ERROR); \
        char ch[1024] = {0}; \
        snprintf(ch, 1024, logmsgformat, ##__VA_ARGS__); \
        logger.Log(ch); \
    } while(0)